﻿using System;
using System.Collections.Generic;
using Monitor.Models.ForWorkWithRepository;
using Monitor.Models.Json;
using Monitor.Repository.DataRepository.LinqModel;

namespace Monitor.Models.Interfaces
{

    #region IDataRepository

    public interface IDataRepository:IDisposable
    {
        /// <summary>
        /// Хранилище информации о БАК-ах
        /// </summary>
        IBakRepository BakRepository { get;}
        /// <summary>
        /// Хранилище информации о машинах
        /// </summary>
        ICarRepository CarRepository { get;}
        /// <summary>
        /// Хранилище информации об измерениях
        /// </summary>
        IMesuringRepository MesuringRepository { get;}
        /// <summary>
        /// Хранилище информации о сервисных службах
        /// </summary>
        IServiceRepository ServiceRepository { get; }
        /// <summary>
        /// Хранилище классификатора
        /// </summary>
        IClassificatorRepository ClassificatorRepository { get; }
    }

    #endregion

    #region ICoordRepository
    /// <summary>
    /// Интерфейс репозитория координат
    /// </summary>
    public interface ICoordRepository
    {
        /// <summary>
        /// Получение последнего местоположения машины по ее индификатору
        /// </summary>
        /// <param name="id">Индификатор машины</param>
        /// <returns>Объект-модель координат</returns>
        RegDataRow GetLastPosition(Int64 id);
    }

    #endregion

    #region IDataRepository

    /// <summary>
    /// объект измерение
    /// </summary>
    public class DataValue
    {
        /// <summary>
        /// Индификатор машины
        /// </summary>
        public Int64 CarId { get; set; }
        /// <summary>
        /// Индификатор измерения
        /// </summary>
        public Int64 MesuringId { get; set; }
        /// <summary>
        /// Время регистрации
        /// </summary>
        public DateTime Date { get; set; }
        /// <summary>
        /// Значение
        /// </summary>
        public decimal? Value { get; set; }
    }

    /// <summary>
    /// Репозиторий измерений
    /// </summary>
    public interface IDataValueRepository
    {
        /// <summary>
        /// Извлекает последнее измерение
        /// </summary>
        /// <param name="p_Id">индификатор машины</param>
        /// <param name="m_Id">индификатор измерения</param>
        /// <returns>объект-измерение</returns>
        DataValue GetLastDataValue(Int64 p_Id, Int64 m_Id);

        /// <summary>
        /// Извлекает измерение на конкретную дату
        /// </summary>
        /// <param name="p_Id">индификатор машины</param>
        /// <param name="m_Id">индификатор измерения</param>
        /// <param name="date">время измерения</param>
        /// <returns>объект-измерение</returns>
        DataValue GetDataValue(Int64 p_Id,Int64 m_Id,DateTime date);
    }

    #endregion

    #region IBakRepository

    public interface IBakRepository
    {
        IEnumerable<Bak> GetBak();
        IEnumerable<Bak> FreeBak { get; }
        Bak GetBak(Int64 id);
        Bak AddBak(BakInput mobel);
        void EditBak(BakInput model);
        void DeleteBak(Int64 id);
    }

    #endregion

    #region ICarRepository

    /// <summary>
    /// Интерфейс репозитория машин
    /// </summary>
    public interface ICarRepository 
    {
        /// <summary>
        /// Список всех доступных машин
        /// </summary>
        /// <returns>позволяет получить доступ ко всем доступным машинам без обработки</returns>
        IEnumerable<Car> GetCars();

        /// <summary>
        /// Извлекает из БД машину по ее индификатору
        /// </summary>
        /// <param name="id">индификатор</param>
        /// <returns>объект-машина</returns>
        Car GetCarById(Int64 id);
        /// <summary>
        /// Добавление в базу новой машины
        /// </summary>
        /// <param name="model">модель новой машины</param>
        /// <returns>объект-машина</returns>
        Car AddCar(CarInput model);

        /// <summary>
        /// Редактирование уже сущствующей машины
        /// </summary>
        /// <param name="model">модель редактируемой машины</param>
        void EditCar(CarInput model);

        /// <summary>
        /// Удаление машины из базы данных
        /// </summary>
        /// <param name="id">индификатор машины</param>
        void DeleteCar(Int64 id);
    }

    #endregion

    #region IMesuringRepository
    /// <summary>
    /// Интерфейс репозитория
    /// </summary>
    public interface IMesuringRepository
    {
        /// <summary>
        /// Репозиторий координат
        /// </summary>
        ICoordRepository CoordRepository { get; }
        /// <summary>
        /// Репозиторий измерений с CAN шины
        /// </summary>
        IDataValueRepository DataValueRepository { get; }
    }

    #endregion

    #region IServiceRepository
    /// <summary>
    /// Интерфейс работы с сервисными центрами
    /// </summary>
    public interface IServiceRepository
    {
        /// <summary>
        /// Получить сервис из БД
        /// </summary>
        /// <param name="id">индификатор</param>
        /// <returns>объект-сервис</returns>
        Servise GetServise(Int64 id);
        /// <summary>
        /// Добавляет или обновляет информацию о сервисе в БД
        /// </summary>
        /// <param name="id">индификатор</param>
        /// <param name="contract">модель</param>
        void AddOrUpdateService(Int64 id, ClassifDealerModel contract);
    }

    #endregion

    #region IClassificatorRepository

    /// <summary>
    /// Репозиторий классификатора
    /// </summary>
    public interface IClassificatorRepository
    {
        /// <summary>
        /// Извлекает запись из классификатора
        /// </summary>
        /// <param name="id">индификатор</param>
        /// <returns>объект классификатора</returns>
        Classif GetById(Int64 id);
        /// <summary>
        /// Извлекает ветку детей классификатора
        /// </summary>
        /// <param name="id">индификатор родителя</param>
        /// <returns>перечисление объектов классификатора</returns>
        IEnumerable<Classif> GetBranchTree(Nullable<Int64> id);
        /// <summary>
        /// Добавить объект в классификатор
        /// </summary>
        /// <param name="newItem">модель</param>
        /// <returns>объект-классификатора</returns>
        Classif Add(ClassifItem newItem);
        /// <summary>
        /// Редактирование объекта классификатора
        /// </summary>
        /// <param name="upd">Модель</param>
        void Update(ClassifItem upd);
        /// <summary>
        /// Удаление объекта из классификатора
        /// </summary>
        /// <param name="id"></param>
        void Delete(Int64 id);
    }

    #endregion

}
